package com.lgcns.weather.util;

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimeZone;

import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;

public class Util {
    private static final SimpleDateFormat df = new SimpleDateFormat("M/d");

    /**
     * 문자열을 Integer로 변환한다.
     * 
     * @param value
     * @return
     */
    public static Integer parseInteger(String value) {
        Integer result = null;
        try {
            result = Integer.parseInt(value);
        } catch (Exception e) {
            ;
        }

        return result;
    }

    /**
     * 문자열을 Double로 변환한다.
     * 
     * @param value
     * @return
     */
    public static Double parseDouble(String value) {
        Double result = null;
        try {
            result = Double.parseDouble(value);
        } catch (Exception e) {
            ;
        }

        return result;
    }

    /**
     * NodeList의 특정 index에 위치한 attribute 값을 얻는다.
     * 
     * @param list
     * @param attribute
     * @param index
     * @return
     */
    public static String getNodeAttributeValue(NodeList list, String attribute, int index) {
        Element element = (Element) list.item(index);
        return element.getAttribute(attribute);
    }

    /**
     * NodeList의 특정 index에 위치한 attribute 값을 얻는다.
     * 
     * @param list
     * @param attribute
     * @param index
     * @return
     */
    public static Integer getNodeAttributeInteger(NodeList list, String attribute, int index) {
        Element element = (Element) list.item(index);
        return parseInteger(element.getAttribute(attribute));
    }

    /**
     * NodeList의 특정 index에 위치한 Element의 Text를 얻는다.
     * 
     * @param list
     * @param index
     * @return
     */
    public static String getNodeValue(NodeList list, int index) {
        Element element = (Element) list.item(index);
        return element.getFirstChild().getNodeValue();
    }

    /**
     * NodeList의 특정 index에 위치한 Element의 Integer 값을 얻는다.
     * 
     * @param list
     * @param index
     * @return
     */
    public static Integer getNodeInteger(NodeList list, int index) {
        Element element = (Element) list.item(index);
        return parseInteger(element.getFirstChild().getNodeValue());
    }

    /**
     * 날짜 문자열을 날짜(Calendar)로 반환한다.
     * 
     * @param date
     * @return
     */
    public static Calendar parseCalendar(String date) {
        Calendar cal = Calendar.getInstance();
        int year = parseInteger(date.substring(0, 4));
        int month = parseInteger(date.substring(4, 6)) - 1;
        int day = parseInteger(date.substring(6, 8));
        cal.set(year, month, day);

        return cal;
    }

    /**
     * UTC 날짜 문자열을 날짜(Calendar)로 반환한다.
     * 
     * @param date 12자리
     * @return
     */
    public static String getLocalTimeOfSatImage(String date) {
        Calendar cal = Calendar.getInstance();
        
        int year = parseInteger(date.substring(0, 4));
        int month = parseInteger(date.substring(4, 6)) - 1;
        int day = parseInteger(date.substring(6, 8));
        int hour = parseInteger(date.substring(8, 10));
        int min = parseInteger(date.substring(10, 12));
        cal.set(year, month, day, hour, min);
        
        long timeInMillis = cal.getTimeInMillis(); 
        TimeZone tz = TimeZone.getDefault();
        int offset = tz.getOffset(timeInMillis);
        cal.setTimeInMillis(timeInMillis + offset);

        SimpleDateFormat df = new SimpleDateFormat("M월  d일 H시 m분 기준");
        
        return df.format(cal.getTime());
    }

    /**
     * 날짜 문자열을 날짜 포맷으로 반환한다.
     * 
     * @param date 10자리
     * @return
     */
    public static String formatTimeString(String date) {
        Calendar cal = Calendar.getInstance();
        
        int year = parseInteger(date.substring(0, 4));
        int month = parseInteger(date.substring(4, 6)) - 1;
        int day = parseInteger(date.substring(6, 8));
        int hour = parseInteger(date.substring(8, 10));
        cal.set(year, month, day, hour, 0);
        
        SimpleDateFormat df = new SimpleDateFormat("M월  d일 H시");
        
        return df.format(cal.getTime());
    }

    /**
     * 날짜를 더한 결과를 새로운 Calendar로 반환한다.
     * 
     * @param cal
     * @param add
     * @return
     */
    public static Calendar addDate(Calendar cal, int add) {
        Calendar newCal = (Calendar) cal.clone();
        newCal.add(Calendar.DAY_OF_MONTH, add);
        return newCal;
    }

    /**
     * "월/일" 포맷으로 날짜를 반환한다.
     * 
     * @param cal
     * @return
     */
    public static String getSimpleDate(Calendar cal) {
        return (cal != null ? df.format(cal.getTime()) : null);
    }

    /**
     * SharedPreferences에 환경설정값을 저장한다.
     * 
     * @param activity
     * @param key
     * @param value
     */
    public static void savePreference(Activity activity, String key, String value) {
        SharedPreferences pref = activity.getPreferences(Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = pref.edit();
        editor.putString(key, value);
        editor.commit();
    }

    /**
     * SharedPreferences에 환경설정값을 저장한다.
     * 
     * @param activity
     * @param key
     * @param value
     */
    public static void savePreference(Activity activity, String key, int value) {
        SharedPreferences pref = activity.getPreferences(Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = pref.edit();
        editor.putInt(key, value);
        editor.commit();
    }

    /**
     * SharedPreferences에 환경설정값을 저장한다.
     * 
     * @param activity
     * @param key
     * @param value
     */
    public static void savePreference(Activity activity, String key, boolean value) {
        SharedPreferences pref = activity.getPreferences(Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = pref.edit();
        editor.putBoolean(key, value);
        editor.commit();
    }

    /**
     * SharedPreferences에 저장된 환경설정값을 얻는다.
     * 
     * @param activity
     * @param key
     * @param defaultValue
     */
    public static boolean getPreferenceBooleanValue(Activity activity, String key, boolean defaultValue) {
        SharedPreferences pref = activity.getPreferences(Activity.MODE_PRIVATE);
        return pref.getBoolean(key, defaultValue);
    }

    /**
     * SharedPreferences에 저장된 환경설정값을 얻는다.
     * 
     * @param activity
     * @param key
     * @param defaultValue
     */
    public static String getPreferenceStringValue(Activity activity, String key, String defaultValue) {
        SharedPreferences pref = activity.getPreferences(Activity.MODE_PRIVATE);
        return pref.getString(key, defaultValue);
    }

    /**
     * SharedPreferences에 저장된 환경설정값을 얻는다.
     * 
     * @param activity
     * @param key
     * @param defaultValue
     */
    public static int getPreferenceIntValue(Activity activity, String key, int defaultValue) {
        SharedPreferences pref = activity.getPreferences(Activity.MODE_PRIVATE);
        return pref.getInt(key, defaultValue);
    }

    /**
     * 숫자를 포맷한다.
     * 
     * @param value
     * @param format
     * @return
     */
    public static String formatNumber(int value, String format) {
        DecimalFormat df = new DecimalFormat(format);
        return df.format(value);
    }

    /**
     * 숫자를 포맷한다.
     * 
     * @param value
     * @param format
     * @return
     */
    public static String formatNumber(double value, String format) {
        DecimalFormat df = new DecimalFormat(format);
        return df.format(value);
    }
}
